Prometheus๋ฅผ ํตํ APM(์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง)์ ์ ์ฌ๋ ฅ์ ๋ฐํํ์ธ์. ์ด ๊ธ๋ก๋ฒ ์คํ์์ค ์๋ฃจ์ ์ด ํ๋ ์ํคํ ์ฒ์ ๋ํ ํ์ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ์ฌ์ ์๋ฐฉ์ ๋ฌธ์ ํด๊ฒฐ๊ณผ ์ ์ธ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํํจ์ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
Prometheus ๋ฉํธ๋ฆญ: ์ต์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ๊ธ๋ก๋ฒ ํ์ค
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ธ๊ณ ๋น์ฆ๋์ค์ ์ค์ถ์ ๋๋ค. ๋๋ฅ์ ๋๋๋๋ ๊ธ์ต ๊ฑฐ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธ์ต ๊ธฐ๊ด๋ถํฐ ๋งค์ผ ์๋ฐฑ๋ง ๋ช ์ ๋ค์ํ ๊ณ ๊ฐ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์ด๋ฅด๊ธฐ๊น์ง, ์ํํธ์จ์ด์ ์์ ์ฑ๊ณผ ์ฑ๋ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. APM(์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง)์ ํ์ ๋ถ์ผ์์ ์ค์ํ ์ด์ ํ์ ์์๋ก ๋ฐ์ ํ์ผ๋ฉฐ, ์ง๋ฆฌ์ ์์น๋ ๋ฌธํ์ ๋งฅ๋ฝ์ ๊ด๊ณ์์ด ์ด๋ฌํ ํ์ ์์คํ ์ด ์ํํ๊ณ ํจ์จ์ ์ด๋ฉฐ ์ค๋จ ์์ด ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํจ๋ฌ๋ค์, ๋ง์ดํฌ๋ก์๋น์ค ๋ฐ ์ปจํ ์ด๋ํ๋ก์ ์ํคํ ์ฒ ์ ํ์ ์ ๋ก ์๋ ๋ณต์ก์ฑ์ ์ด๋ํ์ต๋๋ค. ์ด๋ฌํ ์ํคํ ์ฒ๋ ํ์ํ ์ ์ฐ์ฑ๊ณผ ํ์ฅ์ฑ์ ์ ๊ณตํ์ง๋ง, ๋ชจ๋ํฐ๋ง์ ๋ํ ์๋ก์ด ๊ณผ์ ๋ ์ ์ํฉ๋๋ค. ์ข ์ข ๋ชจ๋๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ฉ์ผ๋ก ์ค๊ณ๋ ๊ธฐ์กด APM ๋๊ตฌ๋ ๊ณ ๋๋ก ๋ถ์ฐ๋๊ณ ์์์ ์ธ ํ๊ฒฝ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์์ฑ์ ์ ๊ณตํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์คํ์์ค ๋ชจ๋ํฐ๋ง ์์คํ ์ด์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ Prometheus๊ฐ ํ์ ์ ์ธ ์๋ฃจ์ ์ผ๋ก ๋ถ์ํ๋ฉฐ, ํ๋์ ๊ธ๋ก๋ฒ ๋ถ์ฐ ์์คํ ์์ APM์ ์ฌ์ค์ ํ์ค์ด ๋๊ณ ์์ต๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ Prometheus ๋ฉํธ๋ฆญ์ ๋ํด ์ฌ์ธต์ ์ผ๋ก ๋ค๋ฃจ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ, ํต์ฌ ๊ตฌ์ฑ ์์, ๊ตฌํ ๋ชจ๋ฒ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ ์กฐ์ง์ด ํ์ํ ์ต์ ๋ฒ๋น๋ฆฌํฐ์ ์ด์ ์ฐ์์ฑ์ ๋ฌ์ฑํ ์ ์๋๋ก ์ง์ํ๋ ๋ฐฉ๋ฒ์ ํ๊ตฌํฉ๋๋ค. ์คํํธ์ ๋ถํฐ ๋ค๊ตญ์ ๊ธฐ์ ์ ์ด๋ฅด๋ ๋ค์ํ ํ๊ฒฝ์์์ ๊ด๋ จ์ฑ๊ณผ ์ ์ฐํ ํ(pull) ๊ธฐ๋ฐ ๋ชจ๋ธ์ด ๊ธ๋ก๋ฒ ์ธํ๋ผ์ ์๊ตฌ ์ฌํญ์ ์ด๋ป๊ฒ ์ด์์ ์ผ๋ก ๋ถํฉํ๋์ง ๋ ผ์ํ ๊ฒ์ ๋๋ค.
Prometheus๋ ๋ฌด์์ธ๊ฐ? ๊ธฐ์, ์ฒ ํ ๋ฐ ํต์ฌ ๊ตฌ์ฑ ์์
Prometheus๋ 2012๋ SoundCloud์์ ๊ณ ๋๋ก ๋์ ์ด๊ณ ์ปจํ ์ด๋ํ๋ ์ธํ๋ผ ๋ชจ๋ํฐ๋ง์ ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ด๋ถ ํ๋ก์ ํธ๋ก ์์๋์์ต๋๋ค. Google์ Borgmon ๋ชจ๋ํฐ๋ง ์์คํ ์์ ์๊ฐ์ ๋ฐ์ 2015๋ ์คํ์์คํ๋์๊ณ , Kubernetes์ ์ด์ด ๋ ๋ฒ์งธ ํธ์คํ ํ๋ก์ ํธ๋ก Cloud Native Computing Foundation(CNCF)์ ๋น ๋ฅด๊ฒ ํฉ๋ฅํ์ต๋๋ค. ๊ทธ ์ฒ ํ์ ๋จ์์ฑ, ์ ๋ขฐ์ฑ, ๊ทธ๋ฆฌ๊ณ ๊ณ ๋๋ก ๋์ ์ธ ํ๊ฒฝ์์ ํจ๊ณผ์ ์ผ๋ก ์ด์๋ ์ ์๋ ๋ฅ๋ ฅ์ ๋ฟ๋ฆฌ๋ฅผ ๋๊ณ ์์ต๋๋ค.
๋ฐ์ดํฐ ํธ์ฑ ์์ด์ ํธ์ ์์กดํ๋ ๋ง์ ๊ธฐ์กด ๋ชจ๋ํฐ๋ง ์์คํ ๊ณผ ๋ฌ๋ฆฌ, Prometheus๋ ํ(pull) ๊ธฐ๋ฐ ๋ชจ๋ธ์ ์ฑํํฉ๋๋ค. ๊ตฌ์ฑ๋ ๊ฐ๊ฒฉ์ผ๋ก HTTP ์๋ํฌ์ธํธ๋ฅผ ์คํฌ๋ฉํ์ฌ ๋ฉํธ๋ฆญ์ ์์งํ๋ฏ๋ก, ํ์ค HTTP ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ฉํธ๋ฆญ์ ๋ ธ์ถํ๋ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํนํ ์ ํฉํฉ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ํนํ ๋คํธ์ํฌ ํ ํด๋ก์ง๊ฐ ์์ฃผ ๋ณ๊ฒฝ๋๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋จ๋ช ํ๋ ์ปจํ ์ด๋๋ก ๋ฐฐํฌ๋๋ ํ๊ฒฝ์์ ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค.
Prometheus ์์ฝ์์คํ ์ ์ฃผ์ ๊ตฌ์ฑ ์์
Prometheus์ ํ์ ์ํํ๊ฒ ํจ๊ป ์๋ํ๋ ์์ง๋ ฅ ์๋ ๋๊ตฌ ์์ฝ์์คํ ์ ์์ต๋๋ค.
- Prometheus Server: ์์คํ ์ ํต์ฌ์ ๋๋ค. ๊ตฌ์ฑ๋ ๋์์์ ๋ฉํธ๋ฆญ์ ์คํฌ๋ฉํ๊ณ , ์๊ณ์ด ๋ฐ์ดํฐ๋ก ์ ์ฅํ๋ฉฐ, ๊ท์น ๊ธฐ๋ฐ ๊ฒฝ๊ณ ๋ฅผ ์คํํ๊ณ , PromQL ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ํฉ๋๋ค. ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ์๊ณ์ด ๋ฐ์ดํฐ์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ต๋๋ค.
- Exporters: Prometheus๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ ์์คํ
์ ์ง์ ๋ชจ๋ํฐ๋งํ ์๋ ์์ต๋๋ค. Exporter๋ ๋ค์ํ ์์ค(์: ์ด์ ์ฒด์ , ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ)์ ๋ฉํธ๋ฆญ์ Prometheus ํธํ ํ์์ผ๋ก ๋ณํํ์ฌ HTTP ์๋ํฌ์ธํธ๋ฅผ ํตํด ๋
ธ์ถํ๋ ์๊ณ ๋จ์ผ ๋ชฉ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์
๋๋ค. ์๋ฅผ ๋ค์ด, ํธ์คํธ ์์ค ๋ฉํธ๋ฆญ์ ์ํ
node_exporter, Kubernetes ํด๋ฌ์คํฐ ์ํ๋ฅผ ์ํkube-state-metrics, ๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค Exporter๊ฐ ์์ต๋๋ค. - Pushgateway: Prometheus๋ ์ฃผ๋ก ํ(pull) ๊ธฐ๋ฐ์ด์ง๋ง, ํนํ ์์์ ์ด๊ฑฐ๋ ๋จ๋ช ํ๋ ๋ฐฐ์น ์์ ๊ณผ ๊ฐ์ด ๋์์ ์์ ์ ์ผ๋ก ์คํฌ๋ฉํ ์ ์๋ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๋ค. Pushgateway๋ ์ด๋ฌํ ์์ ์ด ์์ ์ ๋ฉํธ๋ฆญ์ Pushgateway๋ก ํธ์ํ๋๋ก ํ์ฉํ๋ฉฐ, Prometheus๋ ์ด๋ฅผ ์คํฌ๋ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ผ์์ ์ธ ํ๋ก์ธ์ค์ ๋ฉํธ๋ฆญ์ด ์บก์ฒ๋ฉ๋๋ค.
- Alertmanager: ์ด ๊ตฌ์ฑ ์์๋ Prometheus ์๋ฒ์์ ๋ณด๋ธ ๊ฒฝ๊ณ ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ฒฝ๊ณ ๋ฅผ ์ค๋ณต ์ ๊ฑฐํ๊ณ , ๊ทธ๋ฃนํํ๋ฉฐ, ์ ์ ํ ์์ ์(์: ์ด๋ฉ์ผ, Slack, PagerDuty, VictorOps, ์ฌ์ฉ์ ์ง์ ์นํ )์๊ฒ ๋ผ์ฐํ ํฉ๋๋ค. ๋ํ ๊ฒฝ๊ณ ์คํฐ์ ๋ฐฉ์งํ๊ณ ์ฌ๋ฐ๋ฅธ ํ์ด ๊ด๋ จ ์๋ฆผ์ ๋ฐ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ์ค์ํ ๊ฒฝ๊ณ ์๊ฑฐ(silencing) ๋ฐ ์ต์ (inhibition) ๊ท์น์ ์ง์ํฉ๋๋ค.
- Client Libraries: ์ฌ์ฉ์ ์ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ธกํ๊ธฐ ์ํด Prometheus๋ ์ธ๊ธฐ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(Go, Java, Python, Ruby, Node.js, C#, ๋ฑ)์ฉ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ์ง์ ๋ฉํธ๋ฆญ์ Prometheus ํ์์ผ๋ก ์ฝ๊ฒ ๋ ธ์ถํ ์ ์์ต๋๋ค.
- Grafana: Prometheus ํ๋ก์ ํธ์ ์๊ฒฉํ ์ผ๋ถ๋ ์๋์ง๋ง, Grafana๋ Prometheus์ ํจ๊ป ์ฌ์ฉ๋๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋ ฅํ ์๊ฐํ ๋๊ตฌ์ ๋๋ค. ์ฌ์ฉ์๊ฐ Prometheus ๋ฐ์ดํฐ๋ก๋ถํฐ ํ๋ถํ๊ณ ์ํธ ์์ฉ์ ์ธ ๋์๋ณด๋๋ฅผ ์์ฑํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ์ธํ๋ผ ์ฑ๋ฅ์ ๋ํ ํ์ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋ ๋ฐฉ์: ๊ฐ์
์ฌ๋ฌ ํด๋ผ์ฐ๋ ๋ฆฌ์ ์ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋ฐฐํฌ๋ ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ์์ํด ๋ณด์ธ์. Prometheus๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค.
- ๊ณ์ธก(Instrumentation): ๊ฐ๋ฐ์๋ Prometheus ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์ดํฌ๋ก์๋น์ค(์: ์ฌ๊ณ ์๋น์ค, ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด, ์ฌ์ฉ์ ์ธ์ฆ)๋ฅผ ๊ณ์ธกํฉ๋๋ค.
http_requests_total(์นด์ดํฐ),request_duration_seconds(ํ์คํ ๊ทธ๋จ),active_user_sessions(๊ฒ์ด์ง)์ ๊ฐ์ ๋ฉํธ๋ฆญ์ ์ ์ํฉ๋๋ค. - ๋ฉํธ๋ฆญ ๋
ธ์ถ: ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๋ ์ด๋ฌํ ๋ฉํธ๋ฆญ์ ์ ์ฉ HTTP ์๋ํฌ์ธํธ(์ผ๋ฐ์ ์ผ๋ก
/metrics)์ ๋ ธ์ถํฉ๋๋ค. - ์คํฌ๋ฉ(Scraping): ๊ฐ ๋ฆฌ์ ๋๋ ์ค์์ ๋ฐฐํฌ๋ Prometheus ์๋ฒ๋ ์ ๊ธฐ์ ์ธ ๊ฐ๊ฒฉ(์: 15์ด๋ง๋ค)์ผ๋ก ์ด๋ฌํ
/metrics์๋ํฌ์ธํธ๋ฅผ ๊ฒ์ํ๊ณ ์คํฌ๋ฉํ๋๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. - ์ ์ฅ: ์คํฌ๋ฉ๋ ๋ฉํธ๋ฆญ์ Prometheus์ ์๊ณ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ๋ฉํธ๋ฆญ์ ์ด๋ฆ๊ณผ ๋ ์ด๋ธ์ด๋ผ๋ ํค-๊ฐ ์ ์ธํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ฐ๋ ฅํ ํํฐ๋ง ๋ฐ ์ง๊ณ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ์ฟผ๋ฆฌ: SRE(์ฌ์ดํธ ์ ๋ขฐ์ฑ ์์ง๋์ด) ๋ฐ DevOps ํ์ PromQL(Prometheus Query Language)์ ์ฌ์ฉํ์ฌ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
rate(http_requests_total{job="payment_service", status="5xx"}[5m])๋ฅผ ์ฟผ๋ฆฌํ์ฌ ๊ฒฐ์ ์๋น์ค์์ ๋ฐ์ํ๋ 5xx ์ค๋ฅ์ 5๋ถ๊ฐ ๋น์จ์ ํ์ธํ ์ ์์ต๋๋ค. - ๊ฒฝ๊ณ (Alerting): PromQL ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Prometheus์ ๊ฒฝ๊ณ ๊ท์น์ด ์ ์๋ฉ๋๋ค. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ์ฌ์ ์ ์๋ ์๊ณ๊ฐ(์: ์ค๋ฅ์จ์ด 1% ์ด๊ณผ)์ ๋์ผ๋ฉด Prometheus๋ Alertmanager๋ก ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ ๋๋ค.
- ์๋ฆผ: Alertmanager๋ ๊ฒฝ๊ณ ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ ์ฌํ ๊ฒฝ๊ณ ์ ๊ทธ๋ฃนํํ๋ฉฐ, Slack, PagerDuty ๋๋ ์ด๋ฉ์ผ์ ํตํด ๊ด๋ จ ์จ์ฝ(on-call) ํ์ ์๋ฆผ์ ๋ณด๋ ๋๋ค. ์ฌ๊ฐ๋ ๋๋ ์๊ฐ๋์ ๋ฐ๋ผ ๋ค๋ฅธ ํ์ผ๋ก ์์ค์ปฌ๋ ์ด์ ๋ ์๋ ์์ต๋๋ค.
- ์๊ฐํ: Grafana ๋์๋ณด๋๋ Prometheus์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ค์๊ฐ ๋ฐ ๊ณผ๊ฑฐ ์ฑ๋ฅ ๋ฉํธ๋ฆญ์ ํ์ํ๋ฉฐ, ๋ชจ๋ ๋ฆฌ์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ์ ๋์์ ๋ํ ์๊ฐ์ ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ธ๋ก๋ฒ ๋งฅ๋ฝ์์ APM์ ์ํ Prometheus์ ํ
Prometheus๋ ํนํ ๋ณต์กํ ๋ถ์ฐ ์์คํ ์ ํตํด ๊ธ๋ก๋ฒ ๊ท๋ชจ๋ก ์ด์๋๋ ์กฐ์ง์ APM์ ๋งค์ฐ ์ ํฉํ ๋๋ ทํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
ํ๋ ์ํคํ ์ฒ์ ๋ํ ๊ฐ์์ฑ
์ต์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข Kubernetes์ ๊ฐ์ ์ค์ผ์คํธ๋ ์ดํฐ๊ฐ ๊ด๋ฆฌํ๋ ์ปจํ ์ด๋์ ๋ฐฐํฌ๋ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ถ๋ฉ๋๋ค. ์ด๋ฌํ ๊ตฌ์ฑ ์์๋ ์๋ช ์ด ์งง๊ณ , ๋น ๋ฅด๊ฒ ํ์ฅ ๋ฐ ์ถ์๋๋ฉฐ, ๋คํธ์ํฌ ๊ฒฝ๊ณ๋ฅผ ๋์ด ํต์ ํฉ๋๋ค. Prometheus๋ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ๊ณผ ๋ ์ด๋ธ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํตํด ์ด๋ฌํ ๋์ ํ๊ฒฝ์ ๋ํ ํ์ํ ๊ฐ์์ฑ์ ์ ๊ณตํฉ๋๋ค. ์๋ก์ด ์๋น์ค๋ฅผ ์๋์ผ๋ก ๊ฒ์ํ๊ณ , ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ฉฐ, ์ปจํ ์คํธ๊ฐ ํ๋ถํ ๋ฉํธ๋ฆญ์ ์ ๊ณตํ์ฌ ํ์ด ๋ฌผ๋ฆฌ์ ๋๋ ๋ ผ๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ์ํธ ์ฐ๊ฒฐ๋ ์๋น์ค์ ๋ณต์กํ ์น ์ ์ฒด์์ ์ฑ๋ฅ์ ์ดํดํ ์ ์๋๋ก ํฉ๋๋ค.
์ฌ์ ์๋ฐฉ์ ๋ฌธ์ ๊ฐ์ง ๋ฐ ๊ทผ๋ณธ ์์ธ ๋ถ์
๊ธฐ์กด ๋ชจ๋ํฐ๋ง์ ์ข ์ข ์ธ์๋ํธ์ ๋ํ ์ฌํ ๋์์ ์ค์ ์ ๋ก๋๋ค. Prometheus๋ ์ด ํจ๋ฌ๋ค์์ ์ฌ์ ์๋ฐฉ์ ๋ฌธ์ ๊ฐ์ง๋ก ์ ํํฉ๋๋ค. ๊ณ ํด์๋ ๋ฉํธ๋ฆญ์ ์ง์์ ์ผ๋ก ์์งํ๊ณ ๊ฒฝ๊ณ ๊ท์น์ ํ๊ฐํจ์ผ๋ก์จ, ์์ ํ ์ค๋จ์ผ๋ก ํ๋๋๊ธฐ ์ ์ ๋น์ ์์ ์ธ ๋์์ด๋ ์๋ฐํ ๋ฌธ์ ๋ฅผ ํ๋๊ทธ ์ง์ ํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ์๋น์ค์ ๊ฒฝ์ฐ, ์ด๋ ํน์ ๋ฆฌ์ ์ ๊ตญ์ง์ ์ธ ์๋ ์ ํ๋ ํน์ ์๊ฐ๋ ์ฌ์ฉ์์๊ฒ๋ง ์ํฅ์ ๋ฏธ์น ์ ์๋ ํน์ ๋ง์ดํฌ๋ก์๋น์ค์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ์ฌ, ๋ ๋์ ์ฌ์ฉ์ ๊ธฐ๋ฐ์ ์ํฅ์ ๋ฏธ์น๊ธฐ ์ ์ ํ์ด ์ด๋ฅผ ํด๊ฒฐํ ์ ์๋๋ก ํฉ๋๋ค.
๋ค์ํ ํ์ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ
Prometheus๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ฒ์ ๋์ด, ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ถ์ถํ ์ ์๋๋ก ํฉ๋๋ค. ๊ฐ๋ ฅํ ์ฟผ๋ฆฌ ์ธ์ด์ธ PromQL์ ํตํด ์์ง๋์ด๋ ์์์ ๋ ์ด๋ธ(์: ์๋น์ค, ๋ฆฌ์ , ํ ๋ํธ ID, ๋ฐ์ดํฐ ์ผํฐ, ํน์ API ์๋ํฌ์ธํธ)๋ณ๋ก ๋ฉํธ๋ฆญ์ ์ธ๋ถํํ์ฌ ๋ถ์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ธ๋ถํ๋ ์๋ก ๋ค๋ฅธ ๊ทธ๋ฃน์ด ํน์ ์๋น์ค ๋๋ ์ง๋ฆฌ์ ๋ฆฌ์ ์ ๋ด๋นํ ์ ์๋ ๊ธ๋ก๋ฒ ํ์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. ํ ๊ตญ๊ฐ์ ๊ฐ๋ฐ ํ์ ์๋ก ๋ฐฐํฌ๋ ๊ธฐ๋ฅ์ ์ฑ๋ฅ์ ๋ถ์ํ ์ ์๊ณ , ๋ค๋ฅธ ๊ตญ๊ฐ์ ์ด์ ํ์ ์ธํ๋ผ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ผ๋ฉฐ, ์ด ๋ชจ๋ ์์ ์ ๋์ผํ ๊ธฐ๋ณธ ๋ชจ๋ํฐ๋ง ์์คํ ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ธ๋ก๋ฒ ๋ฐฐํฌ๋ฅผ ์ํ ํ์ฅ์ฑ ๋ฐ ์ ์ฐ์ฑ
Prometheus๋ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋จ์ผ Prometheus ์๋ฒ๋ ๊ฐ๋ ฅํ์ง๋ง, ๋ ํฌ๊ณ ๊ธ๋ก๋ฒํ๊ฒ ๋ถ์ฐ๋ ๊ธฐ์ ์ ์ฌ๋ฌ Prometheus ์ธ์คํด์ค๋ฅผ ๋ฐฐํฌํ๊ณ , ํ๋๋ ์ด์ ํ๊ฑฐ๋, Thanos ๋๋ Mimir์ ๊ฐ์ ์ฅ๊ธฐ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ์ฌ์ฉํ์ฌ ๊ธ๋ก๋ฒ ์ง๊ณ ๋ฐ ์ฅ๊ธฐ ๋ณด์กด์ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ์ฐ์ฑ์ ํตํด ์กฐ์ง์ ๋จ์ผ ๋ฐ์ดํฐ ์ผํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ ์ธ๊ณ ๋ชจ๋ ์ฃผ์ ํด๋ผ์ฐ๋ ๊ณต๊ธ์ ์ฒด ๋ฐ ์จํ๋ ๋ฏธ์ค ํ๊ฒฝ์ ์กด์ฌํ๋ ๊ด๊ณ์์ด ํน์ ์๊ตฌ ์ฌํญ์ ๋ง๊ฒ ๋ชจ๋ํฐ๋ง ์ธํ๋ผ๋ฅผ ์กฐ์ ํ ์ ์์ต๋๋ค.
์คํ ์์ค์ ์ด์ : ์ปค๋ฎค๋ํฐ, ๋น์ฉ ํจ์จ์ฑ ๋ฐ ํฌ๋ช ์ฑ
์คํ์์ค ํ๋ก์ ํธ์ธ Prometheus๋ ํ๊ธฐ์ฐฌ ๊ฐ๋ฐ์ ๋ฐ ์ฌ์ฉ์ ๊ธ๋ก๋ฒ ์ปค๋ฎค๋ํฐ์ ์ด์ ์ ๋๋ฆฝ๋๋ค. ์ด๋ ์ง์์ ์ธ ํ์ , ๊ฐ๋ ฅํ ๋ฌธ์ํ ๋ฐ ํ๋ถํ ๊ณต์ ์ง์์ ๋ณด์ฅํฉ๋๋ค. ์กฐ์ง์ ๊ฒฝ์ฐ ์ด๋ ๋น์ฉ ํจ์จ์ฑ(๋ผ์ด์ ์ค ๋น์ฉ ์์), ํฌ๋ช ์ฑ(์ฝ๋๋ฅผ ๊ฐ์ฌํ ์ ์์), ๊ทธ๋ฆฌ๊ณ ๊ณ ์ ํ ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋๋ก ์์คํ ์ ์ฌ์ฉ์ ์ง์ ํ๊ณ ํ์ฅํ ์ ์๋ ๋ฅ๋ ฅ์ผ๋ก ์ด์ด์ง๋๋ค. ์ด ๊ฐ๋ฐฉํ ๋ชจ๋ธ์ ํ์ ์ ์ด์งํ๊ณ ์ ์ธ๊ณ ์กฐ์ง์ด ๊ทธ ๋ฐ์ ์ ๊ธฐ์ฌํ๊ณ ํํ์ ์ป์ ์ ์๋๋ก ํฉ๋๋ค.
APM์ ์ํ ํต์ฌ Prometheus ๊ฐ๋
APM์ ์ํด Prometheus๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
๋ฉํธ๋ฆญ ์ ํ: ์ต์ ๋ฒ๋น๋ฆฌํฐ์ ๊ตฌ์ฑ ์์
Prometheus๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ฐ์ดํฐ๋ฅผ ์บก์ฒํ๋ ๋ฐ ๊ฐ๊ฐ ํน์ ๋ชฉ์ ์ ์ํํ๋ ๋ค ๊ฐ์ง ํต์ฌ ๋ฉํธ๋ฆญ ์ ํ์ ์ ์ํฉ๋๋ค.
- Counter: ํญ์ ์ฆ๊ฐํ๋(๋๋ ์ฌ์์ ์ 0์ผ๋ก ์ฌ์ค์ ๋๋) ๋์ ๋ฉํธ๋ฆญ์
๋๋ค. ์ด HTTP ์์ฒญ ์, ์ด ์ค๋ฅ ์, ํ์์ ์ฒ๋ฆฌ๋ ํญ๋ชฉ ์ ๋ฑ์ ์ธ๋ ๋ฐ ์ด์์ ์
๋๋ค. ์๋ฅผ ๋ค์ด,
http_requests_total{method="POST", path="/api/v1/orders"}๋ ์ ์ธ๊ณ์ ์ผ๋ก ์ฑ๊ณต์ ์ธ ์ฃผ๋ฌธ ์ ์ ์ด์๋ฅผ ์ถ์ ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก PromQL์์rate()๋๋increase()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋น ๋๋ ๊ฐ๊ฒฉ๋น ๋ณ๊ฒฝ๋์ ์ป์ต๋๋ค. - Gauge: ์์๋ก ์ค๋ฅด๊ฑฐ๋ ๋ด๋ฆด ์ ์๋ ๋จ์ผ ์ซ์ ๊ฐ์ ๋ํ๋ด๋ ๋ฉํธ๋ฆญ์
๋๋ค. ๊ฒ์ด์ง๋ ๋์ ์ฌ์ฉ์ ์, ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ์จ๋, ํ์ ํญ๋ชฉ ์์ ๊ฐ์ ํ์ฌ ๊ฐ์ ์ธก์ ํ๋ ๋ฐ ์๋ฒฝํฉ๋๋ค. ์๋ฅผ ๋ค์ด,
database_connections_active{service="billing", region="europe-west1"}๊ฐ ์์ต๋๋ค. - Histogram: ํ์คํ ๊ทธ๋จ์ ๊ด์ธก์น(์์ฒญ ๊ธฐ๊ฐ ๋๋ ์๋ต ํฌ๊ธฐ ๋ฑ)๋ฅผ ์ํ๋งํ๊ณ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ฒํท์ ๋ฐ๋ผ ์๋ฅผ ์
๋๋ค. ๊ฐ์ ๋ถํฌ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๋ฏ๋ก, ๋ฐฑ๋ถ์์(์: 99๋ฒ์งธ ๋ฐฑ๋ถ์์ ์ง์ฐ ์๊ฐ)์ ๊ฐ์ SLI(Service Level Indicators)๋ฅผ ๊ณ์ฐํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ์น ์์ฒญ ๊ธฐ๊ฐ ์ถ์ ์
๋๋ค.
http_request_duration_seconds_bucket{le="0.1", service="user_auth"}๋ 0.1์ด ๋ฏธ๋ง์ด ์์๋๋ ์์ฒญ ์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ํ๊ท ์ง์ฐ ์๊ฐ์ ์คํด์ ์์ง๊ฐ ์์ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ์ดํดํ๋ ๋ฐ ํ์คํ ๊ทธ๋จ์ด ์ค์ํฉ๋๋ค. - Summary: ํ์คํ ๊ทธ๋จ๊ณผ ์ ์ฌํ๊ฒ ์์ฝ๋ ๊ด์ธก์น๋ฅผ ์ํ๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ผ์ด๋ฉ ์๊ฐ ์ฐฝ์ ๊ฑธ์ณ ํด๋ผ์ด์ธํธ ์ธก์์ ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ถ์์(์: 0.5, 0.9, 0.99)๋ฅผ ๊ณ์ฐํฉ๋๋ค. ๊ฐ๋จํ ๋ถ์์ ๊ณ์ฐ์ ์ฌ์ฉํ๊ธฐ๋ ๋ ์ฝ์ง๋ง, Prometheus์์ ์ง๊ณํ ๋ ํ์คํ ๊ทธ๋จ์ ๋นํด ์ฌ๋ฌ ์ธ์คํด์ค์ ๊ฑธ์น ์ง๊ณ์ ๋ํด ๋ ์ ํํ๊ฑฐ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
api_response_time_seconds{quantile="0.99"}๊ฐ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก PromQL์์์ ์ ์ฐ์ฑ ๋๋ฌธ์ ํ์คํ ๊ทธ๋จ์ด ์ ํธ๋ฉ๋๋ค.
๋ ์ด๋ธ: Prometheus ์ฟผ๋ฆฌ ๋ฅ๋ ฅ์ ์ด์
Prometheus์ ๋ฉํธ๋ฆญ์ ๋ฉํธ๋ฆญ ์ด๋ฆ๊ณผ ๋ ์ด๋ธ์ด๋ผ๋ ํค-๊ฐ ์ ์ธํธ๋ก ๊ณ ์ ํ๊ฒ ์๋ณ๋ฉ๋๋ค. ๋ ์ด๋ธ์ ๋ค์ฐจ์ ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ํ์ฉํ๋ฏ๋ก ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ๋ฆฌ์ ๋๋ ์๋น์ค ๋ฒ์ ์ ๋ํด ๋ณ๋์ ๋ฉํธ๋ฆญ์ ์ฌ์ฉํ๋ ๋์ ๋ ์ด๋ธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
http_requests_total{method="POST", handler="/users", status="200", region="us-east", instance="web-01"}
http_requests_total{method="GET", handler="/products", status="500", region="eu-west", instance="web-02"}
์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ํํฐ๋ง, ์ง๊ณ ๋ฐ ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค. ๊ธ๋ก๋ฒ ๋์์๊ฒ ๋ ์ด๋ธ์ ๋ค์์ ์ํด ํ์์ ์ ๋๋ค.
- ๋ฆฌ์ ๋ณ ๋ถ์:
region="asia-southeast1"์ผ๋ก ํํฐ๋งํ์ฌ ์ฑ๊ฐํฌ๋ฅด์ ์ฑ๋ฅ์ ํ์ธํฉ๋๋ค. - ์๋น์ค๋ณ ํต์ฐฐ๋ ฅ:
service="payment_gateway"๋ก ํํฐ๋งํ์ฌ ๊ฒฐ์ ์ฒ๋ฆฌ ๋ฉํธ๋ฆญ์ ๋ถ๋ฆฌํฉ๋๋ค. - ๋ฐฐํฌ ๊ฒ์ฆ:
version="v1.2.3"์ผ๋ก ํํฐ๋งํ์ฌ ๋ชจ๋ ํ๊ฒฝ์์ ์ ๋ฆด๋ฆฌ์ค ์ ํ์ ์ฑ๋ฅ์ ๋น๊ตํฉ๋๋ค. - ํ
๋ํธ ์์ค ๋ชจ๋ํฐ๋ง: SaaS ์ ๊ณต์
์ฒด์ ๊ฒฝ์ฐ, ๋ ์ด๋ธ์
tenant_id="customer_xyz"๋ฅผ ํฌํจํ์ฌ ํน์ ๊ณ ๊ฐ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
๋์ ์นด๋๋๋ฆฌํฐ(๊ณ ์ ํ ๋ ์ด๋ธ ๊ฐ์ด ๋๋ฌด ๋ง์)๋ Prometheus์ ์ฑ๋ฅ๊ณผ ์คํ ๋ฆฌ์ง์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก, ๋ ์ด๋ธ์ ์ ์คํ๊ฒ ๊ณํํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ธ ๋ชจ๋ํฐ๋ง์ ์ค์ํฉ๋๋ค.
์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ: ๋์ ํ๊ฒฝ์ ์ํ ๋์ ๋ชจ๋ํฐ๋ง
ํ๋์ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ง์์ ์ผ๋ก ๋ฐฐํฌ, ํ์ฅ ๋ฐ ์ข ๋ฃ๋ฉ๋๋ค. Prometheus๊ฐ ๋ชจ๋ ์ ์ธ์คํด์ค๋ฅผ ์๋์ผ๋ก ์คํฌ๋ฉํ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋น์ค์ฉ์ ์ด๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. Prometheus๋ ๊ฐ๋ ฅํ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ผ๋ก ์ด๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๋ค์ํ ํ๋ซํผ๊ณผ ํตํฉํ์ฌ ์คํฌ๋ฉ ๋์์ ์๋์ผ๋ก ๊ฒ์ํ ์ ์์ต๋๋ค.
- Kubernetes: ์ผ๋ฐ์ ์ด๊ณ ๊ฐ๋ ฅํ ํตํฉ์ ๋๋ค. Prometheus๋ Kubernetes ํด๋ฌ์คํฐ ๋ด์ ์๋น์ค, ํ๋ ๋ฐ ์๋ํฌ์ธํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
- ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด: AWS EC2, Azure, Google Cloud Platform(GCP) GCE, OpenStack๊ณผ์ ํตํฉ์ ํตํด Prometheus๋ ํ๊ทธ ๋๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์คํด์ค๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
- DNS ๊ธฐ๋ฐ: DNS ๋ ์ฝ๋๋ฅผ ํตํ ๋์ ๊ฒ์.
- ํ์ผ ๊ธฐ๋ฐ: ์ ์ ๋์ ๋๋ ์ฌ์ฉ์ ์ง์ ๋์ค์ปค๋ฒ๋ฆฌ ์์คํ ๊ณผ์ ํตํฉ์ ์ํ ๊ฒ์ ๋๋ค.
์ด๋ฌํ ๋์ ๊ฒ์์ ๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ํ์์ ์ ๋๋ค. ๋จ์ผ Prometheus ๊ตฌ์ฑ์ด ์๋ ๊ฐ์ ์์ด ๋ค์ํ ๋ฆฌ์ ๋๋ ํด๋ฌ์คํฐ์ ์ธํ๋ผ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํ์ฌ ์๋น์ค๊ฐ ์ ์ธ๊ณ์ ์ผ๋ก ์ด๋ํ๊ณ ํ์ฅ๋จ์ ๋ฐ๋ผ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
PromQL: ๊ฐ๋ ฅํ ์ฟผ๋ฆฌ ์ธ์ด
PromQL(Prometheus Query Language)์ ์ฌ์ฉ์๊ฐ ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ณ ์ง๊ณํ ์ ์๋๋ก ํ๋ ํจ์ํ ์ฟผ๋ฆฌ ์ธ์ด์ ๋๋ค. ๋์๋ณด๋, ๊ฒฝ๊ณ ๋ฐ ์์ ๋ถ์์ ์ํ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋๋๋๋ก ๋ค์ฌ๋ค๋ฅํ ์ธ์ด์ ๋๋ค. ๋ค์์ APM๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ ์์ ๋ฐ ์์์ ๋๋ค.
- ์๊ณ์ด ์ ํ:
http_requests_total{job="api-service", status="200"}
์ด๋api-service์์ ์์200์ํ ์ฝ๋๋ฅผ ๊ฐ์ง ๋ชจ๋ HTTP ์์ฒญ ์นด์ดํฐ๋ฅผ ์ ํํฉ๋๋ค. - ๋ณํ์จ:
rate(http_requests_total{job="api-service", status=~"5.."}[5m])
์ง๋ 5๋ถ ๋์์ HTTP 5xx ์ค๋ฅ์ ์ด๋น ํ๊ท ๋น์จ์ ๊ณ์ฐํฉ๋๋ค. ์ด๋ ์๋น์ค ์ ํ๋ฅผ ์๋ณํ๋ ๋ฐ ์ค์ํฉ๋๋ค. - ์ง๊ณ:
sum by (region) (rate(http_requests_total{job="api-service"}[5m]))
API ์๋น์ค์ ์ด ์์ฒญ๋ฅ ์ ์ง๊ณํ๊ณ , ๊ฒฐ๊ณผ๋ฅผregion๋ณ๋ก ๊ทธ๋ฃนํํฉ๋๋ค. ์ด๋ฅผ ํตํด ์๋ก ๋ค๋ฅธ ์ง๋ฆฌ์ ๋ฐฐํฌ ๊ฐ์ ์์ฒญ ๋ณผ๋ฅจ์ ๋น๊ตํ ์ ์์ต๋๋ค. - Top K:
topk(5, sum by (handler) (rate(http_requests_total[5m])))
์์ฒญ๋ฅ ๊ธฐ์ค์ผ๋ก ์์ 5๊ฐ API ํธ๋ค๋ฌ๋ฅผ ์๋ณํ์ฌ ๊ฐ์ฅ ๋ฐ์ ์๋ํฌ์ธํธ๋ฅผ ์ฐพ๋ ๋ฐ ๋์์ ์ค๋๋ค. - ํ์คํ ๊ทธ๋จ ๋ถ์์(SLI):
histogram_quantile(0.99, sum by (le, service) (rate(http_request_duration_seconds_bucket[5m])))
์ง๋ 5๋ถ ๋์ ๊ฐ ์๋น์ค์ ๋ํ HTTP ์์ฒญ ๊ธฐ๊ฐ์ 99๋ฒ์งธ ๋ฐฑ๋ถ์์๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด๋ SLI(Service Level Objectives)์ ๋ํ ์ค์ํ ๋ฉํธ๋ฆญ์ผ๋ก, ํ์ฉ ๊ฐ๋ฅํ ์ง์ฐ ์๊ฐ ๋ฒ์ ๋ด์ ์๋ ์์ฒญ์ ๋ฐฑ๋ถ์จ์ ๋ณด์ฌ์ค๋๋ค. ๊ธ๋ก๋ฒ ์๋น์ค๊ฐ 99%์ ์์ฒญ์ด 200ms ๋ฏธ๋ง์ผ๋ก ์๋ฃ๋์ด์ผ ํ๋ค๋ SLO๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ด ์ฟผ๋ฆฌ๋ ์ด๋ฅผ ์ง์ ๋ชจ๋ํฐ๋งํฉ๋๋ค. - ์ฐ์ ์ฐ์ฐ:
(sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))) * 100
๋ชจ๋ HTTP ์์ฒญ์ ๋ํ 5xx ์ค๋ฅ์ ๋ฐฑ๋ถ์จ์ ๊ณ์ฐํ์ฌ ์ ์ฒด ์์คํ ์ ์ค๋ฅ์จ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ ๊ธ๋ก๋ฒ ์ํ ํ์ธ์ ์ค์ํฉ๋๋ค.
PromQL์ ๋ง์คํฐํ๋ ๊ฒ์ Prometheus์ ์ ์ฒด APM ์ ์ฌ๋ ฅ์ ๋ฐํํ๋ ํต์ฌ์ด๋ฉฐ, ์์ง๋์ด๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ๊ณผ ๋์์ ๋ํด ๊ตฌ์ฒด์ ์ธ ์ง๋ฌธ์ ํ ์ ์๋๋ก ํฉ๋๋ค.
APM์ ์ํ Prometheus ๊ตฌํ: ๊ธ๋ก๋ฒ ํ๋ ์ด๋ถ
๊ธ๋ก๋ฒ ๋ถ์ฐ ํ๊ฒฝ์์ APM์ ์ํด Prometheus๋ฅผ ๋ฐฐํฌํ๋ ค๋ฉด ์ ์คํ ๊ณํ๊ณผ ์ ๋ต์ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ์ฃผ์ ๊ตฌํ ๋จ๊ณ๋ฅผ ๋ค๋ฃจ๋ ํ๋ ์ด๋ถ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ณ์ธก(Instrumentation): ์ต์ ๋ฒ๋น๋ฆฌํฐ์ ํ ๋
ํจ๊ณผ์ ์ธ APM์ ์ ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธก์์ ์์๋ฉ๋๋ค. ์ ์ ์๋ ๋ฉํธ๋ฆญ์ด ์์ผ๋ฉด ๊ฐ์ฅ ์ ๊ตํ ๋ชจ๋ํฐ๋ง ์์คํ ์กฐ์ฐจ๋ ๋ฌด์ฉ์ง๋ฌผ์ ๋๋ค.
- ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ: Prometheus๋ ๊ฑฐ์ ๋ชจ๋ ์ธ๊ธฐ ์๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(Go, Java, Python, Ruby, Node.js, C#, PHP, Rust, ๋ฑ)์ ๋ํ ๊ณต์ ๋ฐ ์ปค๋ฎค๋ํฐ ์ ์ง ๊ด๋ฆฌ ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค์ ์ ํฉํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ญ์์ค. ๋์ค์ ๋ ์ฝ๊ฒ ์ง๊ณํ ์ ์๋๋ก ๋ค๋ฅธ ์ธ์ด ์คํ์์๋ ๋ฉํธ๋ฆญ์ด ๋ ธ์ถ๋๋ ๋ฐฉ์์ ์ผ๊ด์ฑ์ ์ ์งํ์ญ์์ค.
- ์๋ฏธ ์๋ ๋ฉํธ๋ฆญ ์ ์: ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ์ ์ค์ํ ์ธก๋ฉด์ ๋ํ๋ด๋ ๋ฉํธ๋ฆญ์ ์ง์คํ์ญ์์ค. ๋ชจ๋ํฐ๋ง์ '๋ค ๊ฐ์ง ํฉ๊ธ ์ ํธ'๋ ํ๋ฅญํ ์ถ๋ฐ์ ์ ๋๋ค: ์ง์ฐ ์๊ฐ, ํธ๋ํฝ, ์ค๋ฅ ๋ฐ ํฌํ๋.
- ์ง์ฐ ์๊ฐ: ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ(์:
http_request_duration_secondsํ์คํ ๊ทธ๋จ). - ํธ๋ํฝ: ์์คํ
์ ๋ํ ์์(์:
http_requests_total์นด์ดํฐ). - ์ค๋ฅ: ์คํจํ ์์ฒญ์ ๋น์จ(์:
http_requests_total{status=~"5.."}). - ํฌํ๋: ์์คํ ์ด ์ผ๋ง๋ ๋ฐ์์ง(์: CPU, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ํ ๊ธธ์ด - ๊ฒ์ด์ง).
- ๋ฉํธ๋ฆญ ์ด๋ฆ ์ง์ ๋ชจ๋ฒ ์ฌ๋ก: ํ์ ์์น๋ ์๋น์ค ์ธ์ด์ ๊ด๊ณ์์ด ์ ์ฒด ์กฐ์ง์์ ์ผ๊ด๋ ์ด๋ฆ ์ง์ ๊ท์น์ ์ฑํํ์ญ์์ค. snake_case๋ฅผ ์ฌ์ฉํ๊ณ , ์ ์ฉ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋จ์๋ฅผ ํฌํจํ๋ฉฐ, ์ด๋ฆ์ ์ค๋ช
์ ์ผ๋ก ๋ง๋์ญ์์ค(์:
http_requests_total,database_query_duration_seconds). - ์์: ์น ์๋น์ค ๊ณ์ธก(Python Flask):
from flask import Flask, request from prometheus_client import Counter, Histogram, generate_latest app = Flask(__name__) # Define Prometheus metrics REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP Requests', ['method', 'endpoint', 'status']) REQUEST_LATENCY = Histogram('http_request_duration_seconds', 'HTTP Request Latency', ['method', 'endpoint']) @app.route('/') def hello_world(): return 'Hello, World!' @app.route('/api/v1/data') def get_data(): with REQUEST_LATENCY.labels(method=request.method, endpoint='/api/v1/data').time(): # Simulate some work import time time.sleep(0.05) status = '200' REQUEST_COUNT.labels(method=request.method, endpoint='/api/v1/data', status=status).inc() return {'message': 'Data retrieved successfully'} @app.route('/metrics') def metrics(): return generate_latest(), 200, {'Content-Type': 'text/plain; version=0.0.4; charset=utf-8'} if __name__ == '__main____': app.run(host='0.0.0.0', port=5000)์ด ๊ฐ๋จํ ์์๋ ํน์ ์๋ํฌ์ธํธ์ ๋ํ ์์ฒญ ์์ ์ง์ฐ ์๊ฐ์ ์ถ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์ด๋ ๊ธฐ๋ณธ์ ์ธ APM ๋ฉํธ๋ฆญ์ ๋๋ค. ๋ฆฌ์ , ์ธ์คํด์ค ID ๋๋ ๊ณ ๊ฐ ID์ ๋ํ ๋ ์ด๋ธ์ ์ถ๊ฐํ๋ฉด ์ด๋ฌํ ๋ฉํธ๋ฆญ์ด ์ ์ธ๊ณ์ ์ผ๋ก ์ ์ฉํด์ง๋๋ค.
๊ธ๋ก๋ฒ ๋๋ฌ์ ์ํ ๋ฐฐํฌ ์ ๋ต
๋ฐฐํฌ ์ ๋ต์ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๊ท๋ชจ, ์ง๋ฆฌ์ ๋ถํฌ ๋ฐ ์ด์คํ ์๊ตฌ ์ฌํญ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ๋ ๋ฆฝํ ์ธ์คํด์ค: ์๊ท๋ชจ ์กฐ์ง ๋๋ ๊ณ ๋ฆฝ๋ ํ๊ฒฝ(์: ๋จ์ผ ๋ฐ์ดํฐ ์ผํฐ, ํน์ ํด๋ผ์ฐ๋ ๋ฆฌ์ )์ ๊ฒฝ์ฐ ๋จ์ผ Prometheus ์๋ฒ๋ก ์ถฉ๋ถํฉ๋๋ค. ์ค์ ๋ฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋จํ์ง๋ง ํ์ฅ์ฑ์ด ์ ํ์ ์ด๊ณ ๋ด์ฅ๋ ๊ณ ๊ฐ์ฉ์ฑ์ด ์์ต๋๋ค.
- ๋ณต์ ๋ฅผ ํตํ ๊ณ ๊ฐ์ฉ์ฑ(HA): ๋ ์ค์ํ ์๋น์ค์ ๊ฒฝ์ฐ, ๋์ผํ ๋์์ ์คํฌ๋ฉํ๋ ๋ ๊ฐ์ ๋์ผํ Prometheus ์๋ฒ๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค. Alertmanager๋ ๋ ์๋ฒ๋ก๋ถํฐ ๊ฒฝ๊ณ ๋ฅผ ์์ ํ์ฌ ์ด์คํ๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ํฐ๋ง ์์คํ ์์ฒด์ ๋ํ HA๋ฅผ ์ ๊ณตํ์ง๋ง, ์ ์ญ ๋ฐ์ดํฐ ์ง๊ณ๋ฅผ ํด๊ฒฐํ์ง๋ ์์ต๋๋ค.
- ๋ฆฌ์ ๋ณ Prometheus ๋ฐฐํฌ: ๊ธ๋ก๋ฒ ์ค์ ์์๋ ๊ฐ ์ง๋ฆฌ์ ๋ฆฌ์ (์:
us-east-1,eu-central-1,ap-southeast-2) ๋ด์ Prometheus ์๋ฒ(๋๋ HA ์)๋ฅผ ๋ฐฐํฌํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ๊ฐ ๋ฆฌ์ Prometheus๋ ํด๋น ๋ฆฌ์ ๋ด์ ์๋น์ค๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค. ์ด๋ ๋ถํ๋ฅผ ๋ถ์ฐํ๊ณ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ๋ฅผ ์์ค์ ๋ ๊ฐ๊น๊ฒ ์ ์งํฉ๋๋ค. - Thanos/Mimir/Cortex๋ฅผ ์ฌ์ฉํ ๊ธ๋ก๋ฒ ์ง๊ณ: ์ง์ ํ ๊ธ๋ก๋ฒ ๋ทฐ์ ์ฅ๊ธฐ ์ ์ฅ์ ์ํด์๋ Thanos, Mimir ๋๋ Cortex์ ๊ฐ์ ์๋ฃจ์ ์ด ํ์์ ์ ๋๋ค. ์ด๋ฌํ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ Prometheus ์ธ์คํด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๊ณ , ๊ฒฝ๊ณ ๋ฅผ ํตํฉํ๋ฉฐ, ๊ฐ์ฒด ์คํ ๋ฆฌ์ง(์: AWS S3, Google Cloud Storage)์ ๋ฉํธ๋ฆญ์ ์ ์ฅํ์ฌ ์ฅ๊ธฐ ๋ณด์กด ๋ฐ ๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- Kubernetes์์ ํตํฉ: Prometheus Operator๋ Kubernetes ํด๋ฌ์คํฐ์์ Prometheus ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ๋ฅผ ๋จ์ํํฉ๋๋ค. Prometheus ์ธ์คํด์ค, Alertmanager ๋ฐ ์คํฌ๋ฉ ๊ตฌ์ฑ ์ค์ ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์ ์ ์๋ํํ์ฌ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ด ๋ฉ๋๋ค.
- ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด ๊ณ ๋ ค ์ฌํญ: ๋ค๋ฅธ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด(AWS, Azure, GCP)์ ๋ฐฐํฌํ ๋ ๊ฐ์์ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ํ์ฉํ์ญ์์ค. ํ์ํ ๊ฒฝ์ฐ ๋ฆฌ์ ๋๋ ํด๋ผ์ฐ๋ ๊ฐ ๊ฐ์ ์ฌ์ค๋ง(VPN) ๋๋ ํผ์ด๋ง ์ฐ๊ฒฐ์ ํตํด Prometheus๊ฐ ๋์์ ์คํฌ๋ฉํ ์ ์๋๋ก ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋ฐ ๋ณด์ ๊ทธ๋ฃน ๊ตฌ์ฑ์ ํ์ธํ์ญ์์ค.
Grafana๋ฅผ ์ฌ์ฉํ ๋ฐ์ดํฐ ์๊ฐํ: ๊ธ๋ก๋ฒ ํ์ ์ํ ๋์๋ณด๋
Grafana๋ ์์ Prometheus ๋ฉํธ๋ฆญ์ ์ง๊ด์ ์ด๊ณ ์ํธ ์์ฉ์ ์ธ ๋์๋ณด๋๋ก ๋ณํํ์ฌ ๊ฐ๋ฐ์๋ถํฐ ๊ฒฝ์์ง์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ์ฌ๋์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํ๋์ ์ดํดํ ์ ์๋๋ก ํฉ๋๋ค.
- ํจ๊ณผ์ ์ธ ๋์๋ณด๋ ์์ฑ:
- ๊ฐ์ ๋์๋ณด๋: ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์ฃผ์ ์๋น์ค์ ์ ๋ฐ์ ์ธ ๊ธ๋ก๋ฒ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ ์์ค ๋์๋ณด๋(์: ์ด ์์ฒญ๋ฅ , ๊ธ๋ก๋ฒ ์ค๋ฅ์จ, ๋ชจ๋ ๋ฆฌ์ ์ ํ๊ท ์ง์ฐ ์๊ฐ)๋ก ์์ํ์ญ์์ค.
- ์๋น์ค๋ณ ๋์๋ณด๋: ๊ฐ๋ณ ๋ง์ดํฌ๋ก์๋น์ค์ ๋ํ ์ธ๋ถ ๋์๋ณด๋๋ฅผ ์์ฑํ๊ณ , ๊ณ ์ ํ KPI(์: ํน์ API ์ง์ฐ ์๊ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ ์๊ฐ, ๋ฉ์์ง ํ ๊น์ด)์ ์ง์คํ์ญ์์ค.
- ๋ฆฌ์ ๋ณ ๋์๋ณด๋: ํ์ด ์ง๋ฆฌ์ ๋ฆฌ์ ๋ณ๋ก ๋์๋ณด๋๋ฅผ ํํฐ๋งํ์ฌ(Prometheus ๋ ์ด๋ธ์ ๋งคํ๋๋ Grafana์ ํ ํ๋ฆฟ ๋ณ์ ์ฌ์ฉ) ์ง์ญํ๋ ์ฑ๋ฅ ๋ฌธ์ ๋ก ๋น ๋ฅด๊ฒ ๋๋ฆด๋ค์ดํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋น์ฆ๋์ค ์งํฅ ๋์๋ณด๋: ๊ธฐ์ ์ ์ธ ์ง์์ด ๊น์ง ์์ ์ดํด๊ด๊ณ์๋ฅผ ์ํด ๊ธฐ์ ๋ฉํธ๋ฆญ์ ๋น์ฆ๋์ค ๊ด๋ จ KPI(์: ์ ํ์จ, ์ฑ๊ณต์ ์ธ ๊ฒฐ์ ๊ฑฐ๋, ์ฌ์ฉ์ ๋ก๊ทธ์ธ ์ฑ๊ณต๋ฅ )๋ก ๋ณํํฉ๋๋ค.
- ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํต์ฌ ์ฑ๊ณผ ์งํ(KPI):
- ์น ์๋น์ค: ์์ฒญ๋ฅ , ์ค๋ฅ์จ, ์ง์ฐ ์๊ฐ(P50, P90, P99), ํ์ฑ ์ฐ๊ฒฐ, CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: ์ฟผ๋ฆฌ ์ง์ฐ ์๊ฐ, ํ์ฑ ์ฐ๊ฒฐ, ๋๋ฆฐ ์ฟผ๋ฆฌ ์, ๋์คํฌ I/O, ์บ์ ์ ์ค๋ฅ .
- ๋ฉ์์ง ํ: ๋ฉ์์ง ๊ฒ์/์๋น์จ, ํ ๊น์ด, ์๋น์ ์ง์ฐ.
- ๋ฐฐ์น ์์ : ์์ ๊ธฐ๊ฐ, ์ฑ๊ณต/์คํจ์จ, ๋ง์ง๋ง ์คํ ํ์์คํฌํ.
- Grafana์ ๊ฒฝ๊ณ ๊ตฌ์ฑ: Alertmanager๊ฐ ๊ธฐ๋ณธ ๊ฒฝ๊ณ ์์ง์ด์ง๋ง, Grafana๋ ํจ๋์์ ์ง์ ๊ฐ๋จํ ์๊ณ๊ฐ ๊ธฐ๋ฐ ๊ฒฝ๊ณ ๋ฅผ ์ ์ํ ์๋ ์์ต๋๋ค. ์ด๋ ๋์๋ณด๋๋ณ ์๋ฆผ ๋๋ ๋น ๋ฅธ ํ๋กํ ํ์ดํ์ ์ ์ฉํ ์ ์์ต๋๋ค. ํ๋ก๋์ ์ ๊ฒฝ์ฐ Alertmanager์ ๊ฒฝ๊ณ ๋ฅผ ์ค์ ์ง์คํํ์ญ์์ค.
Alertmanager๋ฅผ ํตํ ๊ฒฝ๊ณ : ์ ์ธ๊ณ์ ์ผ๋ก ์ ์์ ์๋ฆผ
Alertmanager๋ Prometheus ๊ฒฝ๊ณ ๋ฅผ ์คํ ๊ฐ๋ฅํ ์๋ฆผ์ผ๋ก ๋ณํํ๋ ๋ฐ ์ค์ํ๋ฉฐ, ๋ค์ํ ์ง๋ฆฌ์ ์์น์ ์กฐ์ง ๊ตฌ์กฐ์ ๊ฑธ์ณ ์ ์์ ์ ์ ํ ์ฌ๋๋ค์๊ฒ ์ ๋ณด๊ฐ ์ ๋ฌ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๊ฒฝ๊ณ ๊ท์น ์ ์: ๊ฒฝ๊ณ ๋ PromQL ์ฟผ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Prometheus์ ์ ์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด:
- ๊ฒฝ๊ณ ๊ทธ๋ฃนํ ๋ฐ ์๊ฑฐ: Alertmanager๋ ์ ์ฌํ ๊ฒฝ๊ณ (์: ๋์ผํ ์๋น์ค์ ์ฌ๋ฌ ์ธ์คํด์ค ์คํจ)๋ฅผ ๋จ์ผ ์๋ฆผ์ผ๋ก ๊ทธ๋ฃนํํ์ฌ ๊ฒฝ๊ณ ํผ๋ก๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์๊ฑฐ๋ ๊ณํ๋ ์ ์ง ๊ด๋ฆฌ ๊ธฐ๊ฐ ๋๋ ์๋ ค์ง ๋ฌธ์ ์ ๋ํด ์ผ์์ ์ผ๋ก ๊ฒฝ๊ณ ๋ฅผ ์ต์ ํ ์ ์์ต๋๋ค.
- ์ต์ ๊ท์น: ์ด๋ฌํ ๊ท์น์ ๋์ผํ ๊ตฌ์ฑ ์์์ ๋ํ ๋ ๋์ ์ฐ์ ์์ ๊ฒฝ๊ณ ๊ฐ ์ด๋ฏธ ํ์ฑ ์ํ์ธ ๊ฒฝ์ฐ ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํฉ๋๋ค(์: ์๋ฒ๊ฐ ์ด๋ฏธ ์์ ํ ๋ค์ด๋ ๊ฒฝ์ฐ ๋์ CPU ์ฌ์ฉ๋์ ๋ํด ์๋ฆฌ์ง ์์).
- ํตํฉ: Alertmanager๋ ๊ธ๋ก๋ฒ ํ์๊ฒ ํ์์ ์ธ ๋ค์ํ ์๋ฆผ ์ฑ๋์ ์ง์ํฉ๋๋ค.
- ํต์ ํ๋ซํผ: Slack, Microsoft Teams, PagerDuty, VictorOps, Opsgenie๋ ์ฆ๊ฐ์ ์ธ ํ ํต์ ๋ฐ ์จ์ฝ ๋กํ ์ด์ ์ ์ํ ๊ฒ์ ๋๋ค.
- ์ด๋ฉ์ผ: ๋ ๊ธด๊ธํ ์๋ฆผ ๋๋ ๋ ๋์ ๋ฐฐํฌ๋ฅผ ์ํ ๊ฒ์ ๋๋ค.
- ์นํ : ์ฌ์ฉ์ ์ง์ ์ธ์๋ํธ ๊ด๋ฆฌ ์์คํ ๋๋ ๊ธฐํ ๋ด๋ถ ๋๊ตฌ์ ํตํฉํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
๊ธ๋ก๋ฒ ์ด์์ ๊ฒฝ์ฐ, Alertmanager ๊ตฌ์ฑ์ด ์จ์ฝ ์ผ์ ๋ฐ ๋ผ์ฐํ ์ ๋ํด ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ๊ณ ๋ คํ๋์ง ํ์ธํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ ๋ฝ ์ ๋ฌด ์๊ฐ ๋์์ ์ค์ ๊ฒฝ๊ณ ๋ ํ ํ์ผ๋ก ๊ฐ๊ณ , ์์์ ์ ๋ฌด ์๊ฐ ๋์์ ๊ฒฝ๊ณ ๋ ๋ค๋ฅธ ํ์ผ๋ก ๋ผ์ฐํ ๋ ์ ์์ต๋๋ค.
- alert: HighErrorRate
expr: (sum(rate(http_requests_total{job="api-service", status=~"5.."}[5m])) by (service, region) / sum(rate(http_requests_total{job="api-service"}[5m])) by (service, region)) * 100 > 5
for: 5m
labels:
severity: critical
annotations:
summary: "{{ $labels.service }} has a high error rate in {{ $labels.region }}"
description: "The {{ $labels.service }} in {{ $labels.region }} is experiencing an error rate of {{ $value }}% for over 5 minutes."
์ด ๊ท์น์ ๋ชจ๋ ๋ฆฌ์ ์ API ์๋น์ค๊ฐ 5๋ถ ์ฐ์ 5%๋ฅผ ์ด๊ณผํ๋ ์ค๋ฅ์จ์ ๊ฐ์ง ๊ฒฝ์ฐ ๊ฒฝ๊ณ ๋ฅผ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. service ๋ฐ region ๋ ์ด๋ธ์ ๊ฒฝ๊ณ ๋ฅผ ๋ฌธ๋งฅ์ ์ผ๋ก ํ๋ถํ๊ฒ ๋ง๋ญ๋๋ค.
์ํฐํ๋ผ์ด์ฆ๊ธ APM์ ์ํ ๊ณ ๊ธ Prometheus
๋ณต์กํ๊ณ ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์ธํ๋ผ๋ฅผ ๊ฐ์ง ๋๊ท๋ชจ ์กฐ์ง์ ๊ฒฝ์ฐ, ํต์ฌ Prometheus ์ค์ ์ ๊ฐํํ๋ ๊ฒ์ด ์ข ์ข ํ์ํฉ๋๋ค.
์ฅ๊ธฐ ์คํ ๋ฆฌ์ง: ๋ก์ปฌ ๋ณด์กด์ ๋์ด
Prometheus์ ๊ธฐ๋ณธ ๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ๋งค์ฐ ํจ์จ์ ์ด์ง๋ง, ์๋์ ์ผ๋ก ๋จ๊ธฐ์ ์ธ ๋ณด์กด(๋ช ์ฃผ์์ ๋ช ๋ฌ)์ ์ํด ์ค๊ณ๋์์ต๋๋ค. ๊ท์ ์ค์, ๊ธฐ๋ก ๋ถ์, ์ฉ๋ ๊ณํ ๋ฐ ์๋ ๊ฐ์ ์ถ์ธ ๋ถ์์ ์ํด์๋ ์ฅ๊ธฐ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ์๋ฃจ์ ์ ์ข ์ข ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ๋ฉฐ, ์ด๋ ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ์ ๋ํด ๋์ ๋ด๊ตฌ์ฑ๊ณผ ๋น์ฉ ํจ์จ์ฑ์ ์ ๊ณตํฉ๋๋ค.
- Thanos: Prometheus ๋ฐฐํฌ๋ฅผ ๊ณ ๊ฐ์ฉ์ฑ, ๋ฉํฐ ํ
๋ํธ, ์ ์ญ์ ์ผ๋ก ์ฟผ๋ฆฌ ๊ฐ๋ฅํ ๋ชจ๋ํฐ๋ง ์์คํ
์ผ๋ก ์ ํํ๋ ๊ตฌ์ฑ ์์ ์ธํธ์
๋๋ค. ์ฃผ์ ๊ตฌ์ฑ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Sidecar: Prometheus ์์ ์์นํ๋ฉฐ, ๊ธฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์ ์ ๋ก๋ํฉ๋๋ค.
- Querier: ์ฟผ๋ฆฌ ๊ฒ์ดํธ์จ์ด ์ญํ ์ ํ๋ฉฐ, ์ฌ๋ฌ Prometheus ์ธ์คํด์ค(Sidecar๋ฅผ ํตํด) ๋ฐ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
- Store Gateway: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ๋ฐ์ดํฐ๋ฅผ Querier์ ๋ ธ์ถํฉ๋๋ค.
- Compactor: ๊ฐ์ฒด ์คํ ๋ฆฌ์ง์์ ์ค๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด์ํ๋งํ๊ณ ์์ถํฉ๋๋ค.
Thanos๋ ์ฌ๋ฌ ๋ฆฌ์ Prometheus ์ธ์คํด์ค์ ๊ฑธ์ณ ํตํฉ๋ ๊ธ๋ก๋ฒ ์ฟผ๋ฆฌ ๋ทฐ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๋ถ์ฐ APM์ ์ด์์ ์ ๋๋ค.
- Mimir ๋ฐ Cortex: ์ด๋ค์ Prometheus ๋ฉํธ๋ฆญ์ ์ํ ์ํ ํ์ฅ ๊ฐ๋ฅํ ์ฅ๊ธฐ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ผ๋ก, ๋ฉํฐ ํ ๋ํธ, ๊ณ ๊ฐ์ฉ์ฑ ๋ฐ ์ ์ญ ๋ถ์ฐ ๋ฐฐํฌ์ฉ์ผ๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ ๋ค ๊ฐ์ฒด ์คํ ๋ฆฌ์ง๋ฅผ ํ์ฉํ๊ณ ์ฟผ๋ฆฌ๋ฅผ ์ํ Prometheus ํธํ API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ํ ๋ฆฌ์ ์์ ์์ฒ ๊ฐ์ ์๋น์ค์ ํํ๋ฐ์ดํธ ๊ท๋ชจ์ ๋ฐ์ดํฐ์ ๋ํ ๋ชจ๋ํฐ๋ง์ ์ค์ ์ง์คํํด์ผ ํ๋ ์กฐ์ง์ ํนํ ์ ํฉํฉ๋๋ค.
ํ๋๋ ์ด์ : ๋ ๋ฆฝ์ ์ธ Prometheus ์ธ์คํด์ค ์ ๋ฐ์ ๋ชจ๋ํฐ๋ง
Prometheus ํ๋๋ ์ด์ ์ ์ค์ Prometheus ์๋ฒ๊ฐ ๋ค๋ฅธ Prometheus ์๋ฒ์์ ์ ํ๋ ๋ฉํธ๋ฆญ์ ์คํฌ๋ฉํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ ๋ค์ ์ฉ๋๋ก ์ ์ฉํฉ๋๋ค.
- ๊ณ์ธต์ ๋ชจ๋ํฐ๋ง: ์ค์ Prometheus๋ ๋ฆฌ์ Prometheus ์ธ์คํด์ค์์ ์ง๊ณ๋ ๋ฉํธ๋ฆญ(์: ๋ฆฌ์ ๋น ์ด ์์ฒญ)์ ์คํฌ๋ฉํ ์ ์์ผ๋ฉฐ, ๋ฆฌ์ ์ธ์คํด์ค๋ ๊ฐ๋ณ ์๋น์ค์์ ์์ธ ๋ฉํธ๋ฆญ์ ์คํฌ๋ฉํฉ๋๋ค.
- ๊ธ๋ก๋ฒ ๊ฐ์: ๋ชจ๋ ์ธ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ค์์ ์ ์ฅํ์ง ์๊ณ ์ ์ฒด ๊ธ๋ก๋ฒ ์ธํ๋ผ์ ๋ํ ์์ ์์ค ๊ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํน์ ์ฌ์ฉ ์ฌ๋ก์๋ ํจ๊ณผ์ ์ด์ง๋ง, ํ๋๋ ์ด์ ์ ๋ถ์ฐ ์ฟผ๋ฆฌ ๋ฐ ์ฅ๊ธฐ ์ ์ฅ์ ๋ํ ๋ ํฌ๊ด์ ์ธ ์๋ฃจ์ ์ ์ ๊ณตํ๋ Thanos ๋๋ Mimir๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋๋ ๋งค์ฐ ๋๊ท๋ชจ์ ๊ธ๋ก๋ฒ ์ง๊ณ์๋ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
์ฌ์ฉ์ ์ง์ Exporter: ์ต์ ๋ฒ๋น๋ฆฌํฐ ๊ฒฉ์ฐจ ํด์
๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ์์คํ ์ด ๊ธฐ๋ณธ์ ์ผ๋ก Prometheus ๋ฉํธ๋ฆญ์ ๋ ธ์ถํ๋ ๊ฒ์ ์๋๋๋ค. ๋ ๊ฑฐ์ ์์คํ , ๋ ์ ์ํํธ์จ์ด ๋๋ ํ์ ๊ธฐ์ ์ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ง์ Exporter๊ฐ ํ์์ ์ ๋๋ค. ์ด๋ค์ ๋ค์๊ณผ ๊ฐ์ ์์ ํ๋ก๊ทธ๋จ์ ๋๋ค.
- ๋์ ์์คํ ์ ์ฐ๊ฒฐ(์: REST API ์ฟผ๋ฆฌ, ๋ก๊ทธ ๊ตฌ๋ฌธ ๋ถ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉ).
- ๊ด๋ จ ๋ฐ์ดํฐ ์ถ์ถ.
- ๋ฐ์ดํฐ๋ฅผ Prometheus ๋ฉํธ๋ฆญ ํ์์ผ๋ก ๋ณํ.
- Prometheus๊ฐ ์คํฌ๋ฉํ ์ ์๋๋ก HTTP ์๋ํฌ์ธํธ๋ฅผ ํตํด ์ด๋ฌํ ๋ฉํธ๋ฆญ ๋ ธ์ถ.
์ด๋ฌํ ์ ์ฐ์ฑ์ ํตํด ๋น๋ค์ดํฐ๋ธ ์์คํ ๋ Prometheus ๊ธฐ๋ฐ APM ์๋ฃจ์ ์ ํตํฉ๋์ด ์ด๊ธฐ์ข ํ๊ฒฝ ์ ๋ฐ์ ๊ฑธ์ณ ์ ์ฒด์ ์ธ ๋ทฐ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ: ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ ๋ณดํธ
๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฐ ์ฑ๋ฅ์ ๋ํ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ํนํ ๋ฐ์ดํฐ๊ฐ ๋ค์ํ ๋คํธ์ํฌ์ ๊ดํ ๊ถ์ ํต๊ณผํ๋ ๊ธ๋ก๋ฒ ๋ฐฐํฌ์์๋ ๊ฐ๋ ฅํ ๋ณด์ ์กฐ์น๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
- ๋คํธ์ํฌ ๋ถํ : Prometheus ์๋ฒ์ Exporter๋ฅผ ์ ์ฉ ๋ชจ๋ํฐ๋ง ๋คํธ์ํฌ์ ๊ฒฉ๋ฆฌํ์ญ์์ค.
- ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ: Prometheus ๋ฐ Grafana ์๋ํฌ์ธํธ๋ฅผ ๋ณดํธํ์ญ์์ค. OAuth2 ํ๋ก์, ๊ธฐ๋ณธ ์ธ์ฆ์ด ํฌํจ๋ ๋ฆฌ๋ฒ์ค ํ๋ก์์ ๊ฐ์ ์๋ฃจ์ ์ ์ฌ์ฉํ๊ฑฐ๋ ๊ธฐ์ ID ๊ณต๊ธ์์ ํตํฉํ์ญ์์ค. ์คํฌ๋ฉ์ ๊ฒฝ์ฐ, Prometheus์ ๋์ ๊ฐ์ ๋ณด์ ํต์ ์ ์ํด TLS๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ๋ฐ์ดํฐ ์ํธํ: ์ ์ก ์ค(TLS) ๋ฐ ์ ์ฅ ์ค(Prometheus ์คํ ๋ฆฌ์ง๋ฅผ ์ํ ๋์คํฌ ์ํธํ, S3์ ๊ฐ์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ์ํ ์ํธํ) ๋ชจ๋ ๋ฉํธ๋ฆญ ๋ฐ์ดํฐ๋ฅผ ์ํธํํ์ญ์์ค.
- ์ ๊ทผ ์ ์ด: Grafana ๋์๋ณด๋ ๋ฐ Prometheus API์ ๋ํด ์๊ฒฉํ ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด(RBAC)๋ฅผ ๊ตฌํํ์ฌ ์น์ธ๋ ์ง์๋ง ๋ชจ๋ํฐ๋ง ๊ตฌ์ฑ์ ๋ณด๊ฑฐ๋ ์์ ํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
- Prometheus ์๊ฒฉ ์ฐ๊ธฐ/์ฝ๊ธฐ: ์๊ฒฉ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ ๋ Prometheus์ ์๊ฒฉ ์คํ ๋ฆฌ์ง ์์คํ ๊ฐ์ ํต์ ์ด TLS ๋ฐ ์ ์ ํ ์ธ์ฆ์ผ๋ก ๋ณดํธ๋๋์ง ํ์ธํ์ญ์์ค.
์ฉ๋ ๊ณํ ๋ฐ ์ฑ๋ฅ ํ๋
๋ชจ๋ํฐ๋ง ํ๊ฒฝ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ Prometheus ์์ฒด๋ฅผ ๋ชจ๋ํฐ๋งํ๊ณ ํ์ฅํด์ผ ํฉ๋๋ค. ๊ณ ๋ ค ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฆฌ์์ค ํ ๋น: Prometheus ์๋ฒ์ CPU, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋์คํฌ I/O๋ฅผ ๋ชจ๋ํฐ๋งํ์ญ์์ค. ํนํ ๊ณ ์นด๋๋๋ฆฌํฐ ๋ฉํธ๋ฆญ ๋๋ ๊ธด ๋ณด์กด ๊ธฐ๊ฐ์ ์ํด ์ถฉ๋ถํ ๋ฆฌ์์ค๊ฐ ํ ๋น๋์๋์ง ํ์ธํ์ญ์์ค.
- ์คํฌ๋ฉ ๊ฐ๊ฒฉ: ์คํฌ๋ฉ ๊ฐ๊ฒฉ์ ์ต์ ํํ์ญ์์ค. ๋์ ๋น๋๋ ์ธ๋ถํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ์ง๋ง, ๋์ ๋ฐ Prometheus์ ๋ํ ๋ถํ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค. ์ธ๋ถํ์ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ๊ท ํ์ ๋ง์ถ์ญ์์ค.
- ๊ท์น ํ๊ฐ: ๋ณต์กํ ๊ฒฝ๊ณ ๊ท์น์ด๋ ๋ง์ ๊ธฐ๋ก ๊ท์น์ ์๋นํ CPU๋ฅผ ์๋นํ ์ ์์ต๋๋ค. PromQL ์ฟผ๋ฆฌ๋ฅผ ์ต์ ํํ๊ณ ๊ท์น์ด ํจ์จ์ ์ผ๋ก ํ๊ฐ๋๋๋ก ํ์ญ์์ค.
- ์ฌ๋ ์ด๋ธ๋ง(Relabeling): ์คํฌ๋ฉ ๋์ ๋๋ ์ฌ๋ ์ด๋ธ๋ง ๊ท์น ์ค์ ์์น ์๋ ๋ฉํธ๋ฆญ ๋ฐ ๋ ์ด๋ธ์ ์ ๊ทน์ ์ผ๋ก ์ ๊ฑฐํ์ญ์์ค. ์ด๋ ์นด๋๋๋ฆฌํฐ ๋ฐ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ค์ ๋๋ค.
์ค์ Prometheus: ๊ธ๋ก๋ฒ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
Prometheus์ ๋ค์ฌ๋ค๋ฅํจ์ ๊ด๋ฒ์ํ ์ฐ์ ๋ฐ ๊ธ๋ก๋ฒ ์ด์ ๋ชจ๋ธ ์ ๋ฐ์ APM์ ์ ํฉํฉ๋๋ค.
์ ์์๊ฑฐ๋ ํ๋ซํผ: ์ํํ ์ผํ ๊ฒฝํ
๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๋ชจ๋ ์๊ฐ๋์ ๊ณ ๊ฐ์๊ฒ ์น์ฌ์ดํธ ๋ฐ ๋ฐฑ์๋ ์๋น์ค๊ฐ ๋น ๋ฅด๊ณ ์ ๋ขฐํ ์ ์๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค. Prometheus๋ ๋ค์์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
- ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด: ๋ค์ํ ํตํ ๋ฐ ๋ฆฌ์ ์์ ์ฒ๋ฆฌ๋๋ ๊ฑฐ๋์ ๋ํ ์ง์ฐ ์๊ฐ ๋ฐ ์ค๋ฅ์จ(์:
payment_service_requests_total{gateway="stripe", currency="EUR"}). - ์ฌ๊ณ ์๋น์ค: ๋ถ์ฐ๋ ์ฐฝ๊ณ ์ ๋ํ ์ค์๊ฐ ์ฌ๊ณ ์์ค ๋ฐ ์
๋ฐ์ดํธ ์ง์ฐ ์๊ฐ(์:
inventory_stock_level{warehouse_id="london-01"}). - ์ฌ์ฉ์ ์ธ์
๊ด๋ฆฌ: ๊ฐ์ธํ๋ ์ถ์ฒ์ ์ํ ํ์ฑ ์ฌ์ฉ์ ์ธ์
, ๋ก๊ทธ์ธ ์ฑ๊ณต๋ฅ ๋ฐ API ์๋ต ์๊ฐ(์:
user_auth_login_total{status="success", region="apac"}). - CDN ์ฑ๋ฅ: ์ง๋ฆฌ์ ์ผ๋ก ๋ถ์ฐ๋ ์ฌ์ฉ์๋ฅผ ์ํ ์บ์ ์ ์ค๋ฅ ๋ฐ ์ฝํ ์ธ ์ ์ก ์ง์ฐ ์๊ฐ.
Prometheus์ Grafana๋ฅผ ํตํด ํ์ ๊ฒฐ์ ์ง์ฐ์ด ํน์ ๊ตญ๊ฐ์ ๊ฒฐ์ ์ ๊ณต์ ์ฒด์๋ง ํด๋น๋๋์ง, ์๋๋ฉด ์ผ๋ฐ์ ์ธ ์ฌ๊ณ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ชจ๋ ๋ฆฌ์ ์ ์ํฅ์ ๋ฏธ์น๋์ง ์ ์ํ๊ฒ ์๋ณํ ์ ์์ผ๋ฏ๋ก, ๋ชฉํ์ ๋ง๋ ์ ์ํ ์ธ์๋ํธ ๋์์ด ๊ฐ๋ฅํฉ๋๋ค.
SaaS ์ ๊ณต์ ์ฒด: ๋ค์ํ ๊ณ ๊ฐ์ ์ํ ์ ํ์ ๋ฐ ์ฑ๋ฅ
๊ธ๋ก๋ฒ ๊ณ ๊ฐ ๊ธฐ๋ฐ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ SaaS ๊ธฐ์ ์ ๋์ ๊ฐ์ฉ์ฑ๊ณผ ์ผ๊ด๋ ์ฑ๋ฅ์ ๋ณด์ฅํด์ผ ํฉ๋๋ค. Prometheus๋ ๋ค์์ ์ถ์ ํ์ฌ ๋์์ ์ค๋๋ค.
- ์๋น์ค ์
ํ์ ๋ฐ ์ง์ฐ ์๊ฐ: ๊ณ ๊ฐ ๋ฆฌ์ ๋๋ ํ
๋ํธ๋ณ๋ก ๋ถ๋ฅ๋ ์ค์ API ๋ฐ ์ฌ์ฉ์ ๋๋ฉด ๊ธฐ๋ฅ์ ๋ํ SLI ๋ฐ SLO(์:
api_latency_seconds_bucket{endpoint="/dashboard", tenant_id="enterprise_asia"}). - ๋ฆฌ์์ค ํ์ฉ: ํฌํ ์ํ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๊ธฐ๋ณธ ์ธํ๋ผ(VM, ์ปจํ ์ด๋)์ CPU, ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋์คํฌ I/O.
- ํ
๋ํธ๋ณ ๋ฉํธ๋ฆญ: ๋ค์ค ํ
๋ํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ
tenant_id๋ ์ด๋ธ์ด ์๋ ์ฌ์ฉ์ ์ง์ ๋ฉํธ๋ฆญ์ ํตํด ๊ฐ๋ณ ๊ณ ๊ฐ์ ๋ฆฌ์์ค ์๋น ๋ฐ ์ฑ๋ฅ ๊ฒฉ๋ฆฌ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์์ผ๋ฉฐ, ์ด๋ SLA(Service Level Agreements)์ ๋งค์ฐ ์ค์ํฉ๋๋ค. - API ํ ๋น๋ ์ ์ฉ: ๊ณต์ ํ ์ฌ์ฉ์ ๋ณด์ฅํ๊ณ ๋จ์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๋ณ API ํธ์ถ ์ ํ ๋ฐ ์ฌ์ฉ๋์ ์ถ์ ํฉ๋๋ค.
์ด๋ฅผ ํตํด SaaS ์ ๊ณต์ ์ฒด๋ ์ฑ๋ฅ์ด ๋ณดํธ์ ์ผ๋ก ์ ํ๋๊ธฐ ์ ์ ์ง์ญํ๋ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ๊ณ ๊ฐ์๊ฒ ์ฌ์ ์๋ฐฉ์ ์ผ๋ก ์ฐ๋ฝํ๊ฑฐ๋ ํน์ ๋ฆฌ์ ์ ๋ฆฌ์์ค๋ฅผ ํ์ฅํ ์ ์์ต๋๋ค.
๊ธ์ต ์๋น์ค: ํธ๋์ญ์ ๋ฌด๊ฒฐ์ฑ ๋ฐ ๋ฎ์ ์ง์ฐ ์๊ฐ ๋ณด์ฅ
๊ธ์ต ์๋น์ค์์๋ ๋ชจ๋ ๋ฐ๋ฆฌ์ด์ ๋ชจ๋ ํธ๋์ญ์ ์ด ์ค์ํฉ๋๋ค. ๊ธ๋ก๋ฒ ๊ธ์ต ๊ธฐ๊ด์ ๊ท์ ์ค์ ๋ฐ ๊ณ ๊ฐ ์ ๋ขฐ ์ ์ง๋ฅผ ์ํด ๋ชจ๋ํฐ๋ง์ ์์กดํฉ๋๋ค.
- ํธ๋์ญ์
์ฒ๋ฆฌ: ๋ค์ํ ํธ๋์ญ์
์ ํ์ ๋ํ ์ข
๋จ ๊ฐ ์ง์ฐ ์๊ฐ, ์ฑ๊ณต/์คํจ์จ, ๋ฉ์์ง ๋ธ๋ก์ปค์ ํ ๊น์ด(์:
transaction_process_duration_seconds,payment_queue_depth). - ์์ฅ ๋ฐ์ดํฐ ํผ๋: ๋ค์ํ ๊ธ๋ก๋ฒ ๊ฑฐ๋์์ ๋ฐ์ดํฐ ์ง์ฐ ์๊ฐ ๋ฐ ์ต์ ์ฑ(์:
market_data_feed_delay_seconds{exchange="nyse"}). - ๋ณด์ ๋ชจ๋ํฐ๋ง: ์คํจํ ๋ก๊ทธ์ธ ์๋ ํ์, ๋น์ ์์ ์ธ ์์น์์ ๋ฐ์ํ๋ ์์ฌ์ค๋ฌ์ด API ํธ์ถ.
- ๊ท์ ์ค์: ๊ฐ์ฌ ๊ด๋ จ ๋ฉํธ๋ฆญ์ ์ฅ๊ธฐ ์คํ ๋ฆฌ์ง.
Prometheus๋ ๋ค์ํ ๊ธ์ต ์์ฅ ๋ฐ ๊ท์ ํ๊ฒฝ์์ ์ด์๋๋ ๊ฑฐ๋ ํ๋ซํผ, ๋ฑ ํน ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๊ฒฐ์ ์์คํ ์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์๋ต์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
IoT ์๋ฃจ์ : ๋ฐฉ๋ํ ๋ถ์ฐ ์ฅ์น ํ๋ฆฟ ๊ด๋ฆฌ
IoT ํ๋ซํผ์ ์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์๋ฐฑ๋ง ๊ฐ์ ์ฅ์น๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๊ฒ์ ํฌํจํ๋ฉฐ, ์ข ์ข ์๊ฒฉ ๋๋ ์ด๋ ค์ด ํ๊ฒฝ์ ์์ต๋๋ค. Pushgateway๋ ์ฌ๊ธฐ์์ ํนํ ์ ์ฉํฉ๋๋ค.
- ์ฅ์น ์ํ: ๊ฐ๋ณ ์ฅ์น์ ๋ฐฐํฐ๋ฆฌ ์๋, ์ผ์ ํ๋
๊ฐ, ์ฐ๊ฒฐ ์ํ(์:
iot_device_battery_voltage{device_id="sensor-alpha-001", location="remote-mine-site"}). - ๋ฐ์ดํฐ ์์ง๋ฅ : ๋ค์ํ ์ฅ์น ์ ํ ๋ฐ ๋ฆฌ์ ์์ ์์ ๋๋ ๋ฐ์ดํฐ ๋ณผ๋ฅจ.
- ์ฃ์ง ์ปดํจํ ์ฑ๋ฅ: ์ฃ์ง ์ฅ์น ๋๋ ๊ฒ์ดํธ์จ์ด์ ๋ฆฌ์์ค ํ์ฉ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํ.
Prometheus๋ IoT์ ๊ท๋ชจ์ ๋ถ์ฐ๋ ํน์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ ์ฃผ์ด ์ ์ธ๊ณ ์ฅ์น ํ๋ฆฟ์ ์ด์ ์ํ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
Prometheus๋ฅผ ์ฌ์ฉํ ๊ธ๋ก๋ฒ APM ๋ชจ๋ฒ ์ฌ๋ก ์์ฝ
- ์๊ฒ ์์ํ๊ณ ๋ฐ๋ณต: ํต์ฌ ์๋น์ค ๋ฐ ์ค์ ์ธํ๋ผ๋ฅผ ๊ณ์ธกํ๋ ๊ฒ์ผ๋ก ์์ํ์ญ์์ค. ์ ์ฐจ์ ์ผ๋ก ๋ฉํธ๋ฆญ ์์ง์ ํ์ฅํ๊ณ ๋์๋ณด๋ ๋ฐ ๊ฒฝ๊ณ ๋ฅผ ๊ฐ์ ํ์ญ์์ค.
- ๋ฉํธ๋ฆญ ์ด๋ฆ ์ง์ ๋ฐ ๋ ์ด๋ธ ํ์คํ: ํนํ ๋ค์ํ ํ๊ณผ ๊ธฐ์ ์ ๋ฐ์ ๊ฑธ์ณ ๋ช ํ์ฑ๊ณผ ์ฌ์ด ์ฟผ๋ฆฌ๋ฅผ ์ํด ์ผ๊ด์ฑ์ด ์ค์ํฉ๋๋ค. ๋ฉํธ๋ฆญ ๊ท์น์ ๋ฌธ์ํํ์ญ์์ค.
- ๋ ์ด๋ธ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉ: ๋ ์ด๋ธ์ ์ฌ์ฉํ์ฌ ์ปจํ ์คํธ(๋ฆฌ์ , ์๋น์ค, ๋ฒ์ , ํ ๋ํธ, ์ธ์คํด์ค ID)๋ฅผ ์ถ๊ฐํ์ญ์์ค. ์ ๋์ ์ผ๋ก ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ง๋์น๊ฒ ๋์ ์นด๋๋๋ฆฌํฐ ๋ ์ด๋ธ์ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฏ๋ก ํผํ์ญ์์ค.
- ํจ๊ณผ์ ์ธ ๋์๋ณด๋์ ํฌ์: ๋ค์ํ ๋์(๊ธ๋ก๋ฒ ๊ฐ์, ๋ฆฌ์ ๋ณ ์ฌ์ธต ๋ถ์, ์๋น์ค ์์ค ์ธ๋ถ ์ ๋ณด, ๋น์ฆ๋์ค KPI)์ ๋ง์ถฐ์ง ๋์๋ณด๋๋ฅผ ๋ง๋์ญ์์ค.
- ๊ฒฝ๊ณ ๋ฅผ ์๊ฒฉํ๊ฒ ํ ์คํธ: ๊ฒฝ๊ณ ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐ์ํ๊ณ ์ฌ๋ฐ๋ฅธ ํ์ผ๋ก ์ด๋ํ๋ฉฐ ์คํ ๊ฐ๋ฅํ์ง ํ์ธํ์ญ์์ค. ํผ๋ก๋ฅผ ์ ๋ฐํ๋ ์๋๋ฌ์ด ๊ฒฝ๊ณ ๋ ํผํ์ญ์์ค. ์ฑ๋ฅ ํน์ฑ์ด ๋ค๋ฅธ ๊ฒฝ์ฐ ๋ฆฌ์ ๋ณ๋ก ์๊ณ๊ฐ์ ๋ค๋ฅด๊ฒ ๊ณ ๋ คํ์ญ์์ค.
- ์ฅ๊ธฐ ์คํ ๋ฆฌ์ง ๊ณํ์ ์กฐ๊ธฐ์ ์๋ฆฝ: ๊ด๋ฒ์ํ ๋ฐ์ดํฐ ๋ณด์กด์ด ํ์ํ ๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ๊ฒฝ์ฐ, ๋์ค์ ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ๋ณต์ก์ฑ์ ํผํ๊ธฐ ์ํด ์ฒ์๋ถํฐ Thanos, Mimir ๋๋ Cortex๋ฅผ ํตํฉํ์ญ์์ค.
- ๋ชจ๋ ๊ฒ์ ๋ฌธ์ํ: ๋ฉํธ๋ฆญ ์ ์, ๊ฒฝ๊ณ ๊ท์น ๋ฐ ๋์๋ณด๋ ๋ ์ด์์์ ํฌํจํ์ฌ ๋ชจ๋ํฐ๋ง ์ค์ ์ ๋ํ ํฌ๊ด์ ์ธ ๋ฌธ์๋ฅผ ์ ์งํ์ญ์์ค. ์ด๋ ๊ธ๋ก๋ฒ ํ์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค.
๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
Prometheus๋ APM์ ์ํ ๋๋๋๋ก ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ์กฐ์ง์ ์ ์ฌ์ ์ธ ๊ณผ์ ๋ฅผ ์ธ์งํด์ผ ํฉ๋๋ค.
- ์ด์ ์ค๋ฒํค๋: Prometheus ๊ธฐ๋ฐ ๋ชจ๋ํฐ๋ง ์คํ(Prometheus ์๋ฒ, Alertmanager, Grafana, Exporter, Thanos/Mimir)์ ๊ด๋ฆฌํ๋ ค๋ฉด ํนํ ๋๊ท๋ชจ ํ๊ฒฝ์์ ์ ๋ด ์ด์ ์ ๋ฌธ ์ง์์ด ํ์ํ ์ ์์ต๋๋ค. ๋ฐฐํฌ ๋ฐ ๊ตฌ์ฑ ์๋ํ(์: Kubernetes Operator ์ฌ์ฉ)๋ ์ด๋ฅผ ์ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ํ์ต ๊ณก์ : PromQL์ ๊ฐ๋ ฅํ์ง๋ง ํ์ต ๊ณก์ ์ด ์์ต๋๋ค. ํ์ ๋ณต์กํ ์ฟผ๋ฆฌ ๋ฐ ์์ ์ ์ธ ๊ฒฝ๊ณ ๋ฅผ ์ํด ๊ธฐ๋ฅ์ ์์ ํ ํ์ฉํ๋ ค๋ฉด ๊ต์ก์ ์๊ฐ์ ํฌ์ํด์ผ ํฉ๋๋ค.
- ๋์ ์นด๋๋๋ฆฌํฐ์ ๋ํ ๋ฆฌ์์ค ์ง์ฝ๋: ์ ์คํ๊ฒ ๊ด๋ฆฌํ์ง ์์ผ๋ฉด ๊ณ ์ ํ ๋ ์ด๋ธ ์กฐํฉ ์๊ฐ ๋งค์ฐ ๋ง์ ๋ฉํธ๋ฆญ(๋์ ์นด๋๋๋ฆฌํฐ)์ด Prometheus ์๋ฒ์์ ์๋นํ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋์คํฌ I/O๋ฅผ ์๋นํ์ฌ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ฌ๋ ์ด๋ธ๋ง์ ์ ๋ต์ ์ฌ์ฉ๊ณผ ์ ์คํ ๋ ์ด๋ธ ์ค๊ณ๊ฐ ํ์์ ์ ๋๋ค.
- ๋ฐ์ดํฐ ๋ณด์กด ์ ๋ต: ๊ธฐ๋ก ๋ฐ์ดํฐ์ ํ์์ฑ๊ณผ ์คํ ๋ฆฌ์ง ๋น์ฉ ๋ฐ ์ฑ๋ฅ์ ๊ท ํ์ ๋ง์ถ๋ ๊ฒ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ฅ๊ธฐ ์คํ ๋ฆฌ์ง ์๋ฃจ์ ์ ์ด๋ฅผ ํด๊ฒฐํ์ง๋ง ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค.
- ๋ณด์: ๋ฉํธ๋ฆญ ์๋ํฌ์ธํธ ๋ฐ ๋ชจ๋ํฐ๋ง ์์คํ ์์ฒด์ ๋ํ ๋ณด์ ์ ๊ทผ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋คํธ์ํฌ ๋ณด์, ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ์ ์ ์คํ ๊ตฌ์ฑ์ ์๊ตฌํ๋ ์ค์ํ ์ฌํญ์ ๋๋ค.
๊ฒฐ๋ก
Prometheus๋ ํนํ ๊ธ๋ก๋ฒ, ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐ ๋ง์ดํฌ๋ก์๋น์ค ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ์ํ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ด์์ผ๋ก ํ๊ณ ํ ์๋ฆฌ ์ก์์ต๋๋ค. ํ(pull) ๊ธฐ๋ฐ ๋ชจ๋ธ, ๋ ์ด๋ธ์ ์ฌ์ฉํ ๋ค์ฐจ์ ๋ฐ์ดํฐ ๋ชจ๋ธ, ๊ฐ๋ ฅํ PromQL ๋ฐ ๊ด๋ฒ์ํ ์์ฝ์์คํ ์ ๋ถ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฐ ์ฑ๋ฅ์ ๋ํ ๊น์ด ์๊ณ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ป์ ์ ์๋ ํ์ํ ๋ฅ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ค์ํ ์ง๋ฆฌ์ ๋ฆฌ์ ์์ ์ด์ํ๊ณ ๊ธ๋ก๋ฒ ๊ณ ๊ฐ ๊ธฐ๋ฐ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ์กฐ์ง์๊ฒ Prometheus๋ ๋์ ์๋น์ค ์์ค์ ์ ์งํ๊ณ , ๋ฌธ์ ๋ฅผ ์ ์ํ๊ฒ ์๋ณ ๋ฐ ํด๊ฒฐํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ์ง์์ ์ผ๋ก ์ต์ ํํ๋ ๋ฐ ํ์ํ ์ ์ฐ์ฑ, ํ์ฅ์ฑ ๋ฐ ๊ฐ์์ฑ์ ์ ๊ณตํฉ๋๋ค. Prometheus๋ฅผ ์์ฉํจ์ผ๋ก์จ ์กฐ์ง์ ์ฌํ ๋์์ ์ธ ๋ฌธ์ ํด๊ฒฐ์์ ์ฌ์ ์๋ฐฉ์ ์ธ ๋ฌธ์ ๊ฐ์ง๋ก ์ ํํ์ฌ, ์ฌ์ฉ์๊ฐ ์ด๋์ ์๋ ๋์งํธ ์๋น์ค๊ฐ ํ๋ ฅ์ ์ด๊ณ ๋ฐ์์ ์ด๋ฉฐ ์ ๋ขฐํ ์ ์๋๋ก ๋ณด์ฅํ ์ ์์ต๋๋ค.
์ค๋๋ ์ฐ์ํ APM ์ฌ์ ์ ์์ํ์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ์ธกํ๊ณ , Grafana๋ก ํต์ฐฐ๋ ฅ ์๋ ๋์๋ณด๋๋ฅผ ๊ตฌ์ถํ๋ฉฐ, Alertmanager๋ก ๊ฐ๋ ฅํ ๊ฒฝ๊ณ ์์คํ ์ ํ๋ฆฝํ์ญ์์ค. Prometheus๋ฅผ ํ์ฉํ์ฌ ํ๋ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์ ๋ณต์ก์ฑ์ ๋ง์คํฐํ๊ณ ์ ์ธ๊ณ์ ์ผ๋ก ํ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ธ๋ก๋ฒ ์ปค๋ฎค๋ํฐ์ ๋์ฐธํ์ญ์์ค.